package com.wenyl.tree;

import lombok.Data;

@Data
/**
 * LinkedBinaryTree类表示一个链式二叉树的实现。
 * 该类提供了三种遍历二叉树的方法：前序遍历、中序遍历和后序遍历。
 */
public class LinkedBinaryTree {
    /**
     * 前序遍历二叉树
     * 遍历顺序：根节点 -> 左子树 -> 右子树
     * @param currentNode 当前节点
     */
    public void preOrderTraversal(LBTNode currentNode){
        if(currentNode == null){
            return;
        }
        System.out.print(currentNode.getData()+" ");
        preOrderTraversal(currentNode.getLeftChild());
        preOrderTraversal(currentNode.getRightChild());
    }

    /**
     * 中序遍历二叉树
     * 遍历顺序：左子树 -> 根节点 -> 右子树
     * @param currentNode 当前节点
     */
    public void inOrderTraversal(LBTNode currentNode){
        if(currentNode == null){
            return;
        }
        inOrderTraversal(currentNode.getLeftChild());
        System.out.print(currentNode.getData()+" ");
        inOrderTraversal(currentNode.getRightChild());
    }

    /**
     * 后序遍历二叉树
     * 遍历顺序：左子树 -> 右子树 -> 根节点
     * @param currentNode 当前节点
     */
    public void postOrderTraversal(LBTNode currentNode){
        if(currentNode == null){
            return;
        }
        postOrderTraversal(currentNode.getLeftChild());
        postOrderTraversal(currentNode.getRightChild());
        System.out.print(currentNode.getData()+" ");
    }
}

/**
 * LBTNode类表示二叉树中的一个节点。
 * 每个节点包含一个字符数据和左右子节点的引用。
 */
@Data
class LBTNode{
    /**
     * 节点存储的字符数据
     */
    private char data;
    
    /**
     * 左子节点
     */
    private LBTNode leftChild;
    
    /**
     * 右子节点
     */
    private LBTNode rightChild;
    
    /**
     * 构造一个新的LBTNode
     * @param data 节点存储的字符数据
     */
    public LBTNode(char data){
        this.data = data;
    }
}